\documentclass[a4paper,11pt]{article}
\usepackage[francais]{babel}
\usepackage[utf8]{inputenc}
\usepackage[top=3cm, bottom=2cm, left=2cm, right=2cm]{geometry}
\usepackage{ulem}
\usepackage[T1]{fontenc}
\usepackage{color,listings}

\ifx\pdftexversion\undefined
\usepackage[dvips]{graphicx}
\DeclareGraphicsExtensions{.jpg,.eps}
\DeclareGraphicsRule{.jpg}{eps}{.jpg.bb}{`jpeg2ps -h #1}
\else
\usepackage[pdftex]{graphicx}
\fi

% "couleurliens" va contenir la couleur noire
\definecolor{couleurliens}{rgb}{0.,0.,0.}
% activation des liens dans le PDF
\usepackage[pdftex,colorlinks=true,urlcolor=couleurliens,linkcolor=couleurliens,citecolor=couleurliens]{hyperref}

\title{Projet Imac Communication \\ \textsc{\large{\textdagger~programmation~\textdagger}} }
\author{S.~\textsc{Martin}}


\begin{document}

\maketitle

\tableofcontents

\newpage{}

%~ ################
%~ Début Document #
%~ ###############


%~ Symfony
\section{Symfony}

\subsection{Introduction}

\paragraph{}
Symfony est un framework \footnote{Framework : intègre plusieurs entités comme Pake, Lime, Creole, Propel, Phing} web PHP5, par conséquent il bénéficie des avantages de base de tout framework. Si c'est la première fois que vous utilisez un framework, l'énonciation des concepts  OOP \footnote{OOP : Objet-Oriented Programming}, ORM \footnote{ORM : Objet-Relational Mapping}, MVC \footnote{MVC : Model View Controller}, RAD \footnote{RAD: Rapid Application Development}, DRY \footnote{DRY : Don\'t Repeat Yourself} etc ne vous fera pas sauter de joie, pire,  vous pouvez même fuire. C'est dommage vous allez passer à côté de quelques chose de formidable, vous simplifiant votre vie de développeur.

\paragraph{}
Pour expliquer certains concepts j'utilise souvent des analogies avec le monde réel. Aujourd'hui j'ai décidé de rapprocher l'utilisation de Symfony avec la construction d'une maison. Quand vous utilisez PHP5, Xhtml, Css pour bâtir votre application Web, ça revient à contruire votre maison brique par brique, c'est passionnant vous faites ce que vous voulez, mais c'est terriblement long. Ce qui est intéressant pour vous c'est de décorer votre intérieur, de placer vos meubles, de regarder votre film préféré sur votre écran HD dernier cri, bref construire des murs, qui donneront une pièce puis un étage c'est finalement répétitif et sans grand intérêt. La solution vous la connaissez, c'est de sous traiter ces tâches ennuyeuses, \textbf{Symfony deviendra donc votre architecte/batisseur}, capable comme pour la construction d'un étage, pièce, mur de créer une interface d'administration sur mesure en vue de gérer des articles de presse (par exemple). La quasi totalité des tâches de base sont gérées par Symfony, à condition de lui parler dans sa langue, ça reste une fois de plus très simple.

\paragraph{Avant installation \\}
La section suivante porte sur l'installation de l'architecte Symfony au sein de votre environnement de travail. Une fois installé sur votre machine, vous vous moquez éperdument où se cache symfony, ce qu'il est important de noter c'est que dès que vous voulez le faire travailler sur votre projet ou maison, vous devez être dans votre maison et l'appelez.
En ligne de commande ça donne : \texttt{cd /chemin/projetSymfony/} pour se rendre dans le bon dossier puis \texttt{symfony init-project nomProjet} et hop les fondations de votre maison sont faites, les plans pour les contructions suivantes sont établis, symfony à déjà même prévu de travailler avec des fournisseurs étrangers (base de données) pour recevoir les meubles, je m'étends pas.

\subsection{Installation}
\subsubsection{Pack Serveur, moteur Php}
Comme Symfony permet de travailler sur des applications Web il est crucial de disposer du trio Serveur Web, Php5, Base de données sur votre machine. Il existe diverses manières d'installer le package minimum selon si vous êtes débutants paresseux, Gourous fous ou bien encore sous Linux , MacOs , Windows.
\begin{itemize}
\item \textbf{Linux} (ubuntu) je vous propose de le faire à la main en installant les paquets Apache2 (serveur Web), Php5, Postgresql ou Mysql. \textit{Cf. Installation Serveur}
\item \textbf{Windows}, utilisez WAMP \textit{Cf. Installation Serveur}
\item \textbf{MacOs}, à complétez \textit{Cf. Installation Serveur}
\end{itemize}

\subsubsection{Installation de Symfony}
\paragraph{Linux \\}
Il existe trois manières d'installer Symfony sur votre machine. La première consiste à utiliser SVN \footnote{SVN : Subversion, logiciel permettant de gérer des versions de fichiers facilant le travail collaboratif}, la deuxième par Pear et la dernière via le packet php5-symfony.

On obtera pour la version Pear, qui permettra, tel un transporteur UPS, de nous envoyez notre architecte tout beau tout neuf.

Dans un terminal, tapez :
\begin{itemize}
	\item \texttt{pear channel-discover pear.symfony-project.com} // je consulte le catalogue pear et je m'arrête sur la page qui m'intéresse
	\item \texttt{pear install symfony/symfony} // je passe ma commande pour recevoir mon architecte symfony
\end{itemize}

\textit{Si les commandes pear ne passent pas assurez vous d'avoir pear d'installé : sudu apt-get install php-pear}

\subsection{Utilisation de symfony}
Merci de vous référer à la documentation officielle pour comprendre chaque commande mise à votre disposition. Pour lister les commandes utilisez toujours dans un terminal, la commande \texttt{symfony} on obtient alors  pour la version actuelle 1.0.8 :
\begin{itemize}

\item clear-cache                > clear cached information
\item clear-controllers          > clear controllers
\item disable                    > disables an application in a given environment
\item downgrade                  > downgrade to a previous symfony release
\item enable                     > enables an application in a given environment
\item fix-perms                  > fix directories permissions
\item freeze                     > freeze symfony libraries
\item init-app                   > initialize a new symfony application
\item init-batch                 > initialize a new symfony batch script
\item init-controller            > initialize a new symfony controller script
\item init-module                > initialize a new symfony module
\item init-project               > initialize a new symfony project
\item log-purge                  > purges an applications log files
\item log-rotate                 > rotates an applications log files
\item plugin-install             > install a new plugin
\item plugin-list                > list installed plugins
\item plugin-uninstall           > uninstall a plugin
\item plugin-upgrade             > upgrade a plugin
\item propel-build-all           > generate propel model and sql and initialize database
\item propel-build-all-load      > generate propel model and sql and initialize database, and load data
\item propel-build-db            > create database for current model
\item propel-build-model         > create classes for current model
\item propel-build-schema        > create schema.xml from existing database
\item propel-build-sql           > create sql for current model
\item propel-convert-xml-schema  > create schema.yml from schema.xml
\item propel-convert-yml-schema  > create schema.xml from schema.yml
\item propel-dump-data           > dump data to fixtures directory
\item propel-generate-crud       > generate a new propel CRUD module
\item propel-init-admin          > initialize a new propel admin module
\item propel-init-crud           > initialize a new propel CRUD module
\item propel-insert-sql          > insert sql for current model
\item propel-load-data           > load data from fixtures directory
\item sync                       > synchronise project with another machine
\item test-all                   > launch all tests
\item test-functional            > launch functional tests for an application
\item test-unit                  > launch unit tests
\item unfreeze                   > unfreeze symfony libraries
\item upgrade                    > upgrade to a new symfony release

\item app                        = pake init-app
\item batch                      = pake init-batch
\item cc                         = pake clear-cache
\item controller                 = pake init-controller
\item module                     = pake init-module
  \item new                        = pake init-project

\end{itemize}

\subsection{Trouver de l'aide}
Plusieurs façon de trouver de l'aide, soit en prenant le risque de me contacter à l'adresse martin[dot]sam[at]gmail.com soit en contactant des gens experts dans le domaine sur IRC ou sur la googlegroups symfony.

Pour IRC après vous êtes connecté au serveur Freenode à l'aide de Xchat (par défaut), rejoignez la channel symfony-fr ou symfony en tapant depuis votre logiciel : \texttt{/\#symfony-fr}.

Evidemment il reste la documentation en ligne accessible à l'adresse \url{http://symfony-project.com} et le livre "The Definitive Guide to Symfony" paru aux éditions Apress

%~ Installation Webserver
\section{Installation Webserver}
\subsection{Linux}
Via un terminal, tapez : \\

	\texttt{sudo apt-get install apache2 apache2-utils libapache2-mod-php5 php5 php5-cli php5-mcrypt php5-mysql php5-pgsql php5-sqlite php5-xsl mysql-client mysql-server phpmyadmin postgresql postgresql-client pgadmin3}

%~ Travailler ensemble
\section{Travailler ensemble}
Une des tâches les plus difficile est de s'accorder sur les travaux à réaliser sans que le travail de A gène le travail de B, magie ! des utilitaires existe pour limiter les prises de tête. J'ai choisi subversion mais il en existe bien d'autres. Les paragraphes suivants expliquent très rapidement comment se servir de SVN et comment le partage du code va être possible sur plusieurs machines en même temps, car oui le but c'est bien de pouvoir éditer des fichiers sans avoir constamment à demander "Hey Roger tu bosses sur quoi là ? je peux ouvrir toto.php?, bon j'ai fini le fichier titi.php je te l'envoi ! ah non Bob!! j'ai modifié le fichier titi à l'instant tu vas encore tout m'écraser !!!".

\paragraph{Choix du serveur \\}
Enfin après moultes réfléxions le serveur permettant de stocker et partager notre code sera chez Google. J'ai monté un serveur ave une configuration similaire de celle chez google, chez moi, mais comme pour l'instant on ne peut pas compter sur mon FAI, j'ai abandonné cette optique. Une dernière solution consistait à héberger notre code sur le serveur de la Fac en passant par une connexion sécurisé ssh, Google code reste plus souple, plus rapide à mettre en place et dispose de fonction wiki donc nous restons sur Google Code. \textbf{Ne laisser pas trainer de login / mot de passe dans le code que vous partagez ! Google voit tout}

\subsection{Installer le client Svn}
Pour ubuntu c'est via la commande \texttt{sudo apt-get install subversion} et pour windows en téléchargeant TurtoiseSVN

\subsection{Partager le code}
La première démarche consiste à récupérer le code de base sur votre machine, cette opération permet de créer un dossier sur votre machine appelé dépôt. Comme vous le savez nous travaillons avec Symfony c'est pourquoi le code à récupérer (le début de la maison) doit être placé à la racine du serveur Apache (c'est pas obligatoire si vous utilisez des alias dirigeant le serveur autre part que /var/www).

\begin{verbatim}
	cd /var/www/
	svn co http://googlecode.com/imacode projetImacode --user martin.sam
	password : xxxxxx
\end{verbatim}

Allez hop, vous recevez directement tout le code dans le dossier /var/www/projetImacode.

En apparence finalement on créer juste un dossier avec tout le code à l'intérieur, mais en réalité c'est un peu plus que çà, vous pouvez désormais réaliser des actions particulières sur ce dossier. \\

Une fois à l'intérieur de \texttt{/var/www/projetImacode} vous pouvez : \\
\begin{itemize}
\item Chaque matin avant de coder faire \texttt{svn up}, ce qui permet de récupérer les mises à jour
\item Faire une modification, une faute s'est glissée dans un fichier ouvrez Geany corrigez et refermez le fichier, ensuite envoyez votre correction à tout le monde \texttt{svn ci -m "Je viens de corriger une faute d'orthographe dans le fichier tata.html à laligne 123"}.
\item Supprimer un fichier devenu inutile : \texttt{svn delete nomFichier} puis prévenez l'équipe via \texttt{svn ci -m "Fichier truc ne sert plus à rien"}
\item Ajouter un fichier : créer blabla.php via geany dans le dossier /template puis faites \texttt{svn add /template/blabla.php} puis envoyez à toute l'équipe via un \texttt{svn ci -m "Nouveau fichier qui gère les cookies"}
\item Afficher le journal de bord \texttt{svn log}
\end{itemize}
Documentez vous sur Internet, les commandes ci-dessus ne sont pas les seules même si dans 95 pourcent des cas elles restent suffisantes.

\end{document}
